package com.cy.demo.service.impl;

import com.cy.demo.mapper.CartMapper;
import com.cy.demo.mapper.ProductMapper;
import com.cy.demo.mapper.UserMapper;
import com.cy.demo.pojo.Cart;
import com.cy.demo.pojo.CartVO;
import com.cy.demo.service.ICartService;
import com.cy.demo.service.ex.AccessDeniedException;
import com.cy.demo.service.ex.InsertException;
import com.sun.xml.internal.messaging.saaj.packaging.mime.util.QEncoderStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.xml.crypto.Data;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class ICartServiceImpl implements ICartService {

    @Autowired
    private CartMapper cartMapper;

    @Autowired
    private ProductMapper productMapper;

    //增加或减少单条购物车的数量
    @Override
    public Integer addNum(Integer cid, Integer uid, String username,boolean add) throws Exception {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartMapper.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new Exception("尝试访问的购物车数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致
        if (result.getUid() != uid) {
            // 是：抛出AccessDeniedException
            throw new AccessDeniedException("非法访问");
        }

        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加1得到新的数量num
        int num = result.getNum();

        if (add) {
            num += 1;
        }else if(!add && num > 1){
            num -= 1;
        }else {
            return 0;
        }
        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        int rows = cartMapper.updateCartNum(cid, num, username, now);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }

        // 返回新的数量
        return num;
    }

    //添加到购物车
    @Override
    public void addToCart(int uid, int pid, int amount, String username) {

        Date date = new Date();
        Cart Query = cartMapper.findByUidAndPid(uid,pid);
//        查询当前要添加的购物车是否存在
        if (Query == null){
            // =null 表示该商品目前不存在购物车中，即需要添加新商品

            Cart cart = new Cart();
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);
            //此处传入的参数应该是由ProductMapper根据pid查询出的价格 暂时使用固定数据
            cart.setPrice(productMapper.findById(pid).getPrice());


            //补全日志
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);
            //插入操作
            int rows = cartMapper.insertCart(cart);
            if (rows != 1){
                throw new InsertException("插入数据时产生未知异常！");
            }
        }else {
            //当前商品在购物车中存在，则更新数量
            int num = Query.getNum() + amount;
            int rows = cartMapper.updateCartNum(
                                     Query.getCid(),
                                     num,
                                     Query.getModifiedUser(),
                                     date);
            if (rows != 1){
                throw new InsertException("插入数据时产生未知异常！");
            }
        }

    }


    //购物车展示
    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        return cartMapper.findVOByUid(uid);
    }

    //删除某条购物车记录
    @Override
    public int deleteByCid(int cid) throws Exception {
        Cart result = cartMapper.findByCid(cid);
        int rows;
        if (result!= null){
            rows = cartMapper.deleteByCid(cid);
        }else{
            throw new Exception("该条记录不存在！");
        }

        return rows;

    }

    //获取勾选的所有购物车记录
    @Override
    public List<CartVO> getVOByCids(int uid, int[] cids) throws Exception {
        if (cids == null){
            throw new Exception("cids为空");
        }

        List<CartVO> cartVOList = cartMapper.findVOByCids(cids);

        Iterator<CartVO> iterable = cartVOList.iterator();

        while (iterable.hasNext()){
            CartVO cartVO = iterable.next();
            if (!cartVO.getUid().equals(uid)){
                //当前数据不属于该用户 从集合中移除该元素
                cartVOList.remove(cartVO);
            }
        }

        return cartVOList;
    };

}
